#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
编码处理工具模块
提供字符编码检测和转换功能
"""

import logging
from typing import Union, Optional


CONTROL_CHARS_TABLE = str.maketrans(
    dict.fromkeys([i for i in range(32) if i not in (10, 13)])
)

def remove_control_characters(text: str) -> str:
    """
    将制表符替换为4个空格
    
    Args:
        text (str): 需要处理的文本
        
    Returns:
        str: 移除控制字符并替换制表符后的文本
    """
    text = text.replace('\r\n', '\n')
    return text.expandtabs(4)
def decode_bytes(data: bytes, preferred_encoding: str = 'utf-8') -> str:
    """
    解码字节数据为字符串，支持多种编码格式
    
    Args:
        data (bytes): 要解码的字节数据
        preferred_encoding (str): 首选编码格式，默认为utf-8
        
    Returns:
        str: 解码后的字符串
    """
    # 首先尝试使用首选编码解码
    try:
        return data.decode(preferred_encoding)
    except UnicodeDecodeError as e:
        logging.debug(f"使用{preferred_encoding}解码失败: {e}")
    
    # 如果首选编码失败，尝试其他常用编码
    encodings = ['gbk', 'gb2312', 'ascii', 'latin1']
    if preferred_encoding in encodings:
        encodings.remove(preferred_encoding)
    
    for encoding in encodings:
        try:
            return data.decode(encoding)
        except UnicodeDecodeError:
            logging.debug(f"使用{encoding}解码失败")
            continue
    
    # 如果所有编码都失败，使用首选编码并忽略错误
    logging.warning(f"所有编码尝试均失败，使用{preferred_encoding}并忽略错误")
    return data.decode(preferred_encoding, errors='ignore')


def decode_data(data: Union[str, bytes], preferred_encoding: str = 'utf-8') -> str:
    """
    解码从telnetlib3接收到的数据
    
    telnetlib3库在底层已经处理了大部分数据解码工作，但有时仍可能返回bytes类型。
    此函数确保始终返回字符串类型。
    
    Args:
        data (Union[str, bytes]): 从telnetlib3接收到的数据，可能是字符串或字节
        preferred_encoding (str): 首选编码格式，默认为utf-8
        
    Returns:
        str: 解码后的字符串数据
    """
    if isinstance(data, str):
        # 数据已经是字符串类型，直接返回
        return data
    elif isinstance(data, bytes):
        # 数据是字节类型，需要解码
        return decode_bytes(data, preferred_encoding)
    else:
        # 其他类型，转换为字符串
        logging.warning(f"接收到非字符串非字节类型数据: {type(data)}")
        return str(data)


def detect_encoding(data: bytes) -> str:
    """
    检测字节数据的编码格式
    
    Args:
        data (bytes): 要检测编码的字节数据
        
    Returns:
        str: 检测到的编码格式
    """
    # 尝试UTF-8解码
    try:
        data.decode('utf-8')
        return 'utf-8'
    except UnicodeDecodeError:
        pass
    
    # 尝试GBK解码
    try:
        data.decode('gbk')
        return 'gbk'
    except UnicodeDecodeError:
        pass
    
    # 默认返回UTF-8
    return 'utf-8'